package cn.zhouchao.pet.service.impl;

import cn.zhouchao.pet.domain.PetType;
import cn.zhouchao.pet.mapper.PetTypeMapper;
import cn.zhouchao.pet.service.IPetTypeService;
import cn.zhouchao.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zhouchao
 * @since 2023-03-13
 */
@Service
public class PetTypeServiceImpl extends BaseServiceImpl<PetType> implements IPetTypeService {
    @Autowired
    private PetTypeMapper petTypeMapper;

    @Override
    public List<PetType> tree() {
        List<PetType> list = new ArrayList<>(); // new个ArrayList的子集合，并用父集合List接受，定义泛型
        List<PetType> all = petTypeMapper.findAll(); // 查所有，接受为List集合
        // 对all开启stearm流，然后collect收集，接着再收集 的里面用Collectors将all转换为Map(key:对象的Id,value:对象)
        Map<Long, PetType> map = all.stream().collect(Collectors.toMap(PetType::getId, type -> type));
        for (PetType type : all) { // 增强for遍历集合all，定义 对象的别名
            if (null==type.getPid()){ // 判断 是否存在有 对象的上级，通过对象参数有无父级Id
                list.add(type); // 没上级的就顶级父类，将集合遍历的该类对象，放入准备好的List集合容器中[对象1，对象2，对象3，...]
            }else { // 否则 执行以下判断
                PetType petType = map.get(type.getPid()); // 通过对map集合，并通过key:（get对象父级Id），获取value:（对应的对象）
                List<PetType> children = petType.getChildren(); // 再通过获取的父对象，获取对象的参数，子级对象=>children {此名不可随意起，前端有默认的该字段}
                if (null!=petType){ // 判断 这类父对象对象是否没有参数：避免该对象为空：没数据
                    children.add(type); // 确定该对象有上下级对象，则将该对象放入父对象的children对象字段中[对象1[...]，对象2[...]，对象3[...]，...]
                }
            }
        }
        return list; // 最终返回整理好的List对象集合 [对象1[...]，对象2[...]，对象3[...]，...]
    }
}
